package entity

// 游戏规则，游戏记录

// 房间
type Room struct {
	Id            int64 `json:"id" gorm:"column:id;primarykey;not null;"`     // 自增id
	RoomId        int64 `json:"room_id" gorm:"column:room_id;"`               // 房间id
	UserId        int64 `json:"user_id" gorm:"column:user_id;"`               // 房主的id
	State         int64 `json:"state" gorm:"column:state;"`                   // 房间状态 1:存在  2:解散
	CreatedAt     int64 `json:"created_at" gorm:"column:created_at;"`         // 创建时间
	DissolutionAt int64 `json:"dissolution_at" gorm:"column:dissolution_at;"` // 解散时间
}

func (g *Room) TableName() string {
	return "room"
}

// 房间id表， 主要目的是房间id 随机自增，让用户感觉人很多的错觉
type RoomId struct {
	Id    int64 `json:"id" gorm:"column:id;primarykey;not null;"` // 自增id
	Value int64 `json:"value" gorm:"column:value;"`               // value
}

func (g *RoomId) TableName() string {
	return "room_id"
}

// 房间状态 - 内存
type RoomState struct {
	RoomId    int64            `json:"room_Id"`   // 房间id
	Homeowner int64            `json:"homeowner"` // 房主的id
	UserList  []*RoomUserState `json:"user_list"` // 房间里的玩家
	State     int64            `json:"state"`     // 房主 [ 0:不可开始(玩家未准备，房间人数小于2) 1:可以开始，全部准备(人数>1) ]
	// 其他 [ 2：开始中  3:进入游戏(包括房主) ]
	GameId int64 `json:"game_id"` // 房间一一对应的游戏id
}

// 房间玩家准备状态 - 内存
type RoomUserState struct {
	UserId   int64  `json:"user_id"`
	NickName string `json:"nick_name"`
	Avatar   string `json:"avatar"` // 用户头像
	State    int64  `json:"state"`  // 1:玩家准备 非1:未准备
}

// 游戏对局记录
type GameInfoData struct {
	GameId    int64  `json:"game_id" gorm:"column:game_id;primarykey;not null;"` // 游戏对局id
	RoomId    int64  `json:"room_id" gorm:"column:room_id;"`                     // 房间id
	Homeowner int64  `json:"homeowner" gorm:"column:homeowner;"`                 // 房主的id
	UserList  string `json:"user_list" gorm:"column:user_list;"`                 // 所有玩家的json
	CreatedAt int64  `json:"created_at" gorm:"column:created_at;"`               // 游戏对局创建时间
}

func (g *GameInfoData) TableName() string {
	return "game_info_data"
}

// 游戏对局信息 - 内存
type GameMatch struct {
	GameId      int64            `json:"game_id"`      // 游戏对局id
	RoomId      int64            `json:"room_id"`      // 房间id
	Homeowner   int64            `json:"homeowner"`    // 房主的id
	UserList    []*GameMatchUser `json:"user_list"`    // 所有玩家
	PlayCount   int64            `json:"play_count"`   // 当前轮数，累加一 直到玩10轮结束本局游戏
	State       STATETYPE        `json:"state"`        // 游戏状态
	Item        *GameMatchItem   `json:"item"`         // 当前轮
	BalanceLock bool             `json:"balance_lock"` // 结算锁， 避免重复结算
	Ready       []*UserReady     `json:"ready"`        // 游戏对局的准备信息
}

type UserReady struct {
	UserId  int64 `json:"user_id"`
	IsReady bool  `json:"is_ready"`
}

type GameMatchUser struct {
	UserId   int64  `json:"user_id"`
	NickName string `json:"nick_name"`
	Vocation int64  `json:"vocation"` // 玩家庄闲 0:还未定 1:庄  2:闲
	Score    int64  `json:"score"`    // 分数 总输赢
}

// 游戏对局当前轮数据 - 内存
type GameMatchItem struct {
	Poker        []*PokerData                 `json:"poker"`          // 这轮游戏的一幅牌
	UserMap      map[int64]*GameMatchItemUser `json:"user_map"`       // 每个用户的信息
	LookStart    int64                        `json:"look_start"`     // 用户看牌的开始时间戳
	LookEnd      int64                        `json:"look_end"`       // 用户看牌的结算时间戳
	OperateStart int64                        `json:"operate_start"`  // 用户操作阶段的开始时间戳
	OperateEnd   int64                        `json:"operate_end"`    // 用户操作阶段的结束的时间
	ResultStart  int64                        `json:"result_start"`   // 本轮结束查询阶段的开始时间戳
	ResultEnd    int64                        `json:"result_end"`     // 本轮结束查询阶段的结束的时间
	EndGameStart int64                        `json:"end_game_start"` // 本局游戏结束查询阶段的开始时间戳
	EndGameEnd   int64                        `json:"end_game_end"`   // 本局游戏结束查询阶段的结束时间戳
}

type GameMatchItemUser struct {
	UserId      int64         `json:"user_id"`
	NickName    string        `json:"nick_name"`
	Vocation    int64         `json:"vocation"`     // 玩家庄闲 0:还未定 1:庄  2:闲
	Poker       []*PokerData  `json:"poker"`        // 玩家的牌 - 用于计算
	PokerShow   []*PokerData  `json:"poker_show"`   // 玩家的牌 - 用于显示
	Points      int64         `json:"points"`       // 玩家斗牛的点数 <弃用>
	Bet         []int64       `json:"bet"`          // 本轮的下注
	IsSurrender int64         `json:"is_surrender"` // 是否投降   1:投降  非1:没投降
	PokerResult *DouNiuResult `json:"poker_result"` // 玩家的牌型
	Result      int64         `json:"result"`       // 本轮的输赢 1:赢  2:输
	Score       int64         `json:"score"`        // 本轮输赢的分数  输就是负分
	Multiple    int64         `json:"multiple"`     // 本轮输赢倍数(赢家牌型算出)
}

// 游戏状态，实时获取用
type GameStateData struct {
	RoomId           int64                 `json:"room_id"`            // 房间id
	GameId           int64                 `json:"game_id"`            // 游戏id, 房主点击开始游戏后会生成游戏id
	State            STATETYPE             `json:"state"`              // 1.未选庄闲  2.等待发牌  3.下注阶段  4. 看牌阶段  5.结算阶段  6.本轮结算结束  7.游戏结束(本局游戏10轮结束)
	Remainder        int64                 `json:"remainder"`          // 剩余时间，单位秒 （看牌阶段,操作阶段用）
	Item             int64                 `json:"item"`               // 当前第几轮
	Scoreboard       []*UserScoreboardData `json:"scoreboard"`         // 计分牌 当前局每个玩家的分
	UserListInfo     []*UserInfo           `json:"user_list_info"`     // 用户信息
	UserBet          []*BetInfo            `json:"user_bet"`           // 当前轮是下注信息
	VocationUserId   int64                 `json:"vocation_user_id"`   // 庄家的用户id
	VocationNickName string                `json:"vocation_nick_name"` // 庄家的昵称
	UserPoker        []*UserPokerInfo      `json:"user_poker"`         // 玩家的牌
}

type UserScoreboardData struct {
	UserId int64 `json:"user_id"`
	Score  int64 `json:"score"`
}

type UserInfo struct {
	UserId   int64  `json:"user_id"`
	NickName string `json:"nick_name"`
	Avatar   string `json:"avatar"`    // 用户头像
	IsMaster int64  `json:"is_master"` // 1:是房主
	Vocation int64  `json:"vocation"`  // 玩家庄闲 0:还未定 1:庄  2:闲
	IsReady  int64  `json:"is_ready"`  // 1:已准备  非1:未准备
}

// 当前轮的下注信息
type BetInfo struct {
	UserId   int64   `json:"user_id"`
	NickName string  `json:"nick_name"`
	BetList  []int64 `json:"bet_list"`
}

// 当前轮玩家的牌
type UserPokerInfo struct {
	UserId      int64         `json:"user_id"`
	NickName    string        `json:"nick_name"`
	Avatar      string        `json:"avatar"` // 用户头像
	Poker       []*PokerData  `json:"poker"`
	PokerResult *DouNiuResult `json:"poker_result"` // 牌型大小
}

// 玩家这轮游戏记录 牌，投注，结算
type UserGameItemInfo struct {
	Id               int64  `json:"id" gorm:"column:id;primarykey;not null;"`            // id
	UserId           int64  `json:"user_id" gorm:"column:user_id;"`                      // 玩家id
	GameId           int64  `json:"game_id" gorm:"column:game_id;"`                      // 游戏对局id
	ItemId           int64  `json:"item_id" gorm:"column:item_id;"`                      // 游戏轮数id
	Bet              int64  `json:"bet" gorm:"column:bet;"`                              // 玩家的投注信息
	State            int64  `json:"state" gorm:"column:state;"`                          // 输赢状态  1:赢  非1:输
	Balance          int64  `json:"balance" gorm:"column:balance;"`                      // 本轮玩家结算
	Score            int64  `json:"score" gorm:"column:score;"`                          // 本轮游戏的输赢分
	AllScore         int64  `json:"all_score" gorm:"column:all_score"`                   // 本局游戏总输赢累计分
	Vocation         int64  `json:"vocation" gorm:"column:vocation;"`                    // 玩家庄闲  1:庄  2:闲
	CreatedAt        int64  `json:"created_at" gorm:"column:created_at;"`                // 结算时间
	Poker            string `json:"poker" gorm:"column:poker;"`                          // 玩家的牌信息 json
	PokerResult      string `json:"poker_result" gorm:"column:poker_result;"`            // 玩家牌型 json
	RivalId          int64  `json:"rival_id" gorm:"column:rival_id"`                     // 对手id
	RivalVocation    int64  `json:"rival_vocation" gorm:"column:rival_vocation"`         // 对手庄闲  1:庄  2:闲
	RivalPoker       string `json:"rival_poker" gorm:"column:rival_poker"`               // 对手牌信息 json
	RivalPokerResult string `json:"rival_poker_result" gorm:"column:rival_poker_result"` // 对手牌型 json
	VSMsg            string `json:"vs_msg" gorm:"column:vs_msg"`                         // 对局结构消息
	Multiple         int64  `json:"multiple" gorm:"column:multiple"`                     // 对局输赢倍数
}

func (g *UserGameItemInfo) TableName() string {
	return "user_game_item_info"
}

// 斗牛结果
type DouNiuResult struct {
	Poker       []*PokerData `json:"poker"`         // 原始牌
	HasNiu      int64        `json:"has_niu"`       // 是否有牛  // 0:无牛  1:有牛  2:牛牛  3:五小  4:银牛  5:金牛  6:炸弹
	NiuPoker    []*PokerData `json:"niu_poker"`     // 有牛的牌
	NiuNiuPoker []*PokerData `json:"niu_niu_poker"` // 牛牛的牌 另外两张
	HasNiuStr   string       `json:"has_niu_str"`   // 是否有牛 文字描述
	SpecialZD   string       `json:"special_zd"`    // 特殊牌型-炸弹 什么炸弹
	NiuNum      int64        `json:"niu_num"`       // 有牛 几牛
}

type UserGameRecord struct {
	UserId       int64  `json:"user_id" gorm:"user_id"`   // 用户id
	Vocation     int64  `json:"vocation" gorm:"vocation"` // 玩家庄闲  1:庄  2:闲
	GameId       int64  `json:"game_id" gorm:"game_id"`   // 游戏id
	CreatedAt    int64  `json:"-" gorm:"created_at"`      // 游戏时间
	Score        int64  `json:"score" gorm:"score"`       // 这局游戏输赢分数
	Win          int64  `json:"win" gorm:"-"`             // 1:赢   非1:输
	CreatedAtStr string `json:"created_at" gorm:"-"`
}

type UserGameCount struct {
	UserId int64 `json:"user_id" gorm:"user_id"`
	Num    int64 `json:"num" gorm:"num"`
}
